#include <iostream>
#include <cstring>
#include <set> //导入集合主要是为了存可达点的值
using namespace std;

const int N = 110;
const int M = 100010;

int k, n, h; //获取输入
int s[N];    //存储集合
int res = 0; //存储结果
int f[M];    //存储已经计算出SG函数，防止重复计算，可以认为是个优化，减少递归负担
//这里需要注意，确定集合S与h_i以后，生成的有向图就确定了，这样的话，SG(x)是确定x后可以唯一确定的

int SG(int x)
{
    if (f[x] != -1)  //如果已经确定了的话
        return f[x]; //那么就直接返回以前确认过的值
    //如果没确认过，那么就进行计算
    set<int> ne_sg;                     //记录后面可达点的sg函数的值
    for (int i = 0; i < k; ++i)         //遍历集合中的所有点，目的在于找到所有可达的结点
        if (x - s[i] >= 0)              //只要这个可达点合理
            ne_sg.insert(SG(x - s[i])); //就将其SG函数加入到集合
    if (ne_sg.empty())                  //说白了，一个可达点没有，那么就是末端点，根据定义，末端点的SG函数为0
        return f[x] = 0;
    //能到这里，证明不是末端点，ne_sg里面有东西，我们需要对其进行mex运算
    for (int i = 0;; ++i)    //遍历所有自然数
        if (!ne_sg.count(i)) //如果这个数不存在于这个集合中，那就是我们想要的mex(ne_sg)
            return f[x] = i;
}

int main()
{
    freopen("cin.txt", "r", stdin);
    memset(f, -1, sizeof f); //初始化SG函数，因为现在一个都还没算出来，所以这里全部置为不确定，既-1
    cin >> k;
    for (int i = 0; i < k; ++i)
        cin >> s[i];
    cin >> n;
    while (n--)
    {
        cin >> h;
        res ^= SG(h); //将所有对应的SG函数的值异或起来
    }
    if (res)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}